Fix segment-register dumping in show_registers().
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 14 Feb 2006 18:43:45 +0000 (19:43 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 14 Feb 2006 18:43:45 +0000 (19:43 +0100)
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/domain.c
xen/arch/x86/x86_32/traps.c
xen/arch/x86/x86_64/traps.c
xen/include/asm-x86/system.h

index f70d5ea3291b13d7015171281f859e738b1827ff..1bea8813ed5611302d5a1f1f1872f6b71a08d40a 100644 (file)
@@ -615,10 +615,10 @@ static void save_segments(struct vcpu *v)
     if ( HVM_DOMAIN(v) )
         hvm_save_segments(v);
 
-    __asm__ __volatile__ ( "mov %%ds,%0" : "=m" (regs->ds) );
-    __asm__ __volatile__ ( "mov %%es,%0" : "=m" (regs->es) );
-    __asm__ __volatile__ ( "mov %%fs,%0" : "=m" (regs->fs) );
-    __asm__ __volatile__ ( "mov %%gs,%0" : "=m" (regs->gs) );
+    regs->ds = read_segment_register(ds);
+    regs->es = read_segment_register(es);
+    regs->fs = read_segment_register(fs);
+    regs->gs = read_segment_register(gs);
 
     if ( regs->ds )
         dirty_segment_mask |= DIRTY_DS;
index 3a12b0c161c685ad36c099e3b502aa26c821631b..5d23bea5942b10399c646c5cb7d067a11f497a74 100644 (file)
@@ -37,16 +37,13 @@ void show_registers(struct cpu_user_regs *regs)
         if ( !GUEST_MODE(regs) )
         {
             fault_regs.esp = (unsigned long)&regs->esp;
-            fault_regs.ss = __HYPERVISOR_DS;
-            fault_regs.ds = __HYPERVISOR_DS;
-            fault_regs.es = __HYPERVISOR_DS;
-            fault_regs.cs = __HYPERVISOR_CS;
+            fault_regs.ss = read_segment_register(ss);
+            fault_regs.ds = read_segment_register(ds);
+            fault_regs.es = read_segment_register(es);
+            fault_regs.fs = read_segment_register(fs);
+            fault_regs.gs = read_segment_register(gs);
         }
 
-        __asm__ (
-            "movw %%fs,%0 ; movw %%gs,%1"
-            : "=r" (fault_regs.fs), "=r" (fault_regs.gs) );
-        
         fault_crs[0] = read_cr0();
         fault_crs[3] = read_cr3();
     }
index b4cad7ef85350aa26802033e2bd8afd684816230..cd0ada0a9ebabd1852a5545e1710c978ca7aa143 100644 (file)
@@ -35,6 +35,10 @@ void show_registers(struct cpu_user_regs *regs)
         context = GUEST_MODE(regs) ? "guest" : "hypervisor";
         fault_crs[0] = read_cr0();
         fault_crs[3] = read_cr3();
+        fault_regs.ds = read_segment_register(ds);
+        fault_regs.es = read_segment_register(es);
+        fault_regs.fs = read_segment_register(fs);
+        fault_regs.gs = read_segment_register(gs);
     }
 
     printk("----[ Xen-%d.%d%s    %s ]----\n",
@@ -57,6 +61,10 @@ void show_registers(struct cpu_user_regs *regs)
            fault_regs.r12, fault_regs.r13, fault_regs.r14);
     printk("r15: %016lx   cr0: %016lx   cr3: %016lx\n",
            fault_regs.r15, fault_crs[0], fault_crs[3]);
+    printk("ds: %04x   es: %04x   fs: %04x   gs: %04x   "
+           "ss: %04x   cs: %04x\n",
+           fault_regs.ds, fault_regs.es, fault_regs.fs,
+           fault_regs.gs, fault_regs.ss, fault_regs.cs);
 
     show_stack(regs);
 }
index cb5f64d0016cfc397510406d86831ed6f6d3ec16..7e6b95a0504e2d75ce0004cb03f6073b20a197c5 100644 (file)
@@ -5,6 +5,12 @@
 #include <xen/types.h>
 #include <asm/bitops.h>
 
+#define read_segment_register(name)                                     \
+({  u16 __sel;                                                          \
+    __asm__ __volatile__ ( "movw %%" STR(name) ",%0" : "=r" (__sel) );  \
+    __sel;                                                              \
+})
+
 /* Clear and set 'TS' bit respectively */
 #define clts() __asm__ __volatile__ ("clts")
 #define stts() write_cr0(X86_CR0_TS|read_cr0())